.\" Copyright (c) 1983, 1991 The Regents of the University of California.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" Modified Sat Jul 24 01:15:33 1993 by Rik Faith <faith@cs.unc.edu>
.\" Modified Tue Oct 22 17:55:49 1996 by Eric S. Raymond <esr@thyrsus.com>
.\" Modified Oct 1998 by Andi Kleen
.\" 中文版 Copyright (c) 2002 byeyear 和 www.linuxforum.net
.\"
.TH SEND 2 "July 1999" "Linux Man Page" "Linux Programmer's Manual"
.SH NAME
send, sendto, sendmsg \- 从套接字发送消息
.SH 概述
.B #include <sys/types.h>
.br
.B #include <sys/socket.h>
.sp
.BI "int send(int " s ", const void *" msg ", size_t " len ","
.BI "int " flags );
.br
.BI "int sendto(int " s ", const void *" msg ", size_t " len ","
.BI "int " flags ", const struct sockaddr *" to ", socklen_t " tolen );
.br
.BI "int sendmsg(int " s ", const struct msghdr *" msg ","
.BI "int " flags );
.SH 描述
.BR Send ,
.BR sendto ,
和
.B sendmsg
用于向另一个套接字传递消息.
.B Send
仅仅用于连接套接字,而 
.B sendto
和
.B sendmsg
可用于任何情况下.
.PP
目标地址用
.I to
指定,
.I tolen
定义其长度.消息的长度用
.IR len
指定.
如果消息太长不能通过下层协议,函数将返回
.B EMSGSIZE
错误,消息也不会被送出.
.PP
在数据传送过程中所产生的错误不会返回给
.BR send.
如果发生本地错误,则返回\-1.
.PP
当要发送的消息长度大于套接字当前可用缓冲区时,
.B send
将阻塞,除非在套接字上设置了非阻塞式输入输出模式.
对于非阻塞模式,这种情况下将返回
.B EAGAIN
错误.
The
系统调用
.BR select (2)
可以用来检测何时可以发送更多的数据.
.PP
参数
.I flags
是一个标志字,可以包含下列标志:
.\" XXX document MSG_PROXY
.TP
对于支持带外数据的套接字,
.B MSG_OOB
将送出
.I out-of-band
(带外)数据(比如,
.BR SOCK_STREAM
类型的套接字);
下层协议也必须支持.
.I 带外
数据.
.TP
.B MSG_DONTROUTE
在送出分组时不使用网关.只有直接连接在网络上的主机
才能接收到数据.这个标志通常仅用于诊断和路由程序.
可路由的协议族才能使用这个标志;包套接字不可以.
.TP
.B MSG_DONTWAIT
使用非阻塞式操作;如果操作需要阻塞,将返回
.B EAGAIN 
错误(也可以用
.B F_SETFL
.BR fcntl(2)
设置
.B O_NONBLOCK
实现这个功能.)
.TP
.B MSG_NOSIGNAL
当流式套接字的另一端中断连接时不发送 
.B SIGPIPE 
信号,但仍然返回 
.B EPIPE
错误.
.TP
.BR MSG_CONFIRM " (仅用于Linux 2.3以上版本)"
通知链路层发生了转发过程:得到了另一端的成功应答.
如果链路层没有收到通知,它将按照常规探测网络上的相邻
主机(比如通过免费arp). 
只能用于 
.B SOCK_DGRAM
和
.B SOCK_RAW
类型的套接字,且仅对IPv4和IPv6有效.详情参见
.BR arp (7)
.PP
结构体
.I msghdr
的定义如下.详情参见 
.BR recv (2)
和下文.
.IP
.RS
.nf
.ta 4n 17n 33n
struct msghdr {
	void	* msg_name;	/*地址选项*/
	socklen_t	msg_namelen;	/*地址长度*/
	struct iovec	* msg_iov;	/*消息数组*/
	size_t	msg_iovlen;	/*msg_iov中的元素个数*/
	void	* msg_control;	/*辅助信息,见下文*/
	socklen_t	msg_controllen;	/*辅助数据缓冲区长度*/
	int	msg_flags;	/*接收消息标志*/
};
.ta
.fi
.RE
.PP
可以使用 
.I msg_control 
和
.I msg_controllen 
成员发送任何控制信息.内核所能处理的最大控制消息缓冲区长度由
.B net.core.optmem_max 
sysctl对每个套接字进行限定;参见
.BR socket (7).
.SH 返回值
成功时返回发送的字符个数,否则返回-1.
.SH 错误代码
其中一些是套接字层产生的标准错误.其他的是下层协议模块产生的;参见
各自的man手册.
.TP
.B EBADF
指定了非法描述符.
.TP
.B ENOTSOCK
参数
.I s
不是一个套接字.
.TP
.B EFAULT
参数指定的用户地址空间非法.
.TP
.B EMSGSIZE
消息长度越界.
.TP
.BR EAGAIN "或者" EWOULDBLOCK
套接字设置为非阻塞式,但所请求的操作需要阻塞.
.TP
.B ENOBUFS
网络接口输出队列已满.这通常表明接口已停止发送,也有可能是
暂时性的拥挤(这不会发生在linux下,当设备队列溢出时数据报
只是被简单丢弃.
.TP
.B EINTR
接收到信号.
.TP
.B ENOMEM
没有可用内存.
.TP
.B EINVAL
传递的参数非法. 
.TP
.B EPIPE
连接套接字的本地端已关闭.这种情况下进程还会接收到
.B SIGPIPE
信号,除非设置了
.B MSG_NOSIGNAL 
.SH 兼容于
4.4BSD,SVr4,POSIX1003.1g草案(这些系统调用首次出现于4.2BSD).
.B MSG_CONFIRM 
是Linux所做的扩展.
.SH 注意
上面给出的函数原型遵循Single Unix Specification,
glibc2也是这么做的;
.I flags
参数在BSD4.*中是`int',但在libc4和libc5中是`unsigned int';
参数
.I len
在BSD4.*和libc4中是`int',但在libc5中是'size_t';
参数
.I tolen
在BSD4.*,libc4和libc5中都是`int'.
参见
.BR accept (2).
.SH "SEE ALSO"
.BR fcntl (2),
.BR recv (2),
.BR select (2),
.BR getsockopt (2),
.BR sendfile (2),
.BR socket (2),
.BR write (2),
.BR socket (7),
.BR ip (7),
.BR tcp (7),
.BR udp (7)

.SH "[中文版维护人]"
.B byeyear <love_my_love@263.net >
.SH "[中文版最新更新]"
.B 2002.02.27
.SH "《中国linux论坛man手册页翻译计划》:"
.BI http://cmpp.linuxforum.net
